/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.pieShare.pieShareAppFx.controller;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Path;
import java.util.ResourceBundle;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.util.Callback;
import javax.annotation.PostConstruct;
import org.pieShare.pieShareApp.model.PieShareAppBeanNames;
import org.pieShare.pieShareApp.model.PieUser;
import org.pieShare.pieShareApp.service.configurationService.api.IPieShareConfiguration;
import org.pieShare.pieShareApp.service.fileFilterService.api.IFileFilterService;
import org.pieShare.pieShareApp.service.fileFilterService.filters.RegexFileFilter;
import org.pieShare.pieShareApp.service.fileFilterService.filters.api.IFilter;
import org.pieShare.pieShareApp.service.fileService.api.IFileService;
import org.pieShare.pieShareAppFx.FXMLController;
import org.pieShare.pieShareAppFx.conrolExtensions.TwoColumnListViewEntry;
import org.pieShare.pieShareAppFx.controller.api.IController;
import org.pieShare.pieShareAppFx.controller.api.ITwoColumnListViewItem;
import org.pieShare.pieTools.pieUtilities.service.beanService.IBeanService;
import org.pieShare.pieTools.pieUtilities.service.regexService.IRegexService;
/**
*
* @author Richard
*/
public class FileFilterSettingsController implements IController, ITwoColumnListViewItem {
private FXMLController fXMLController;
private boolean isCorrectRegex = false;
private IRegexService regexService;
private IFileFilterService fileFilterService;
private IBeanService beanService;
private IFileService fileService;
private IPieShareConfiguration configuration;
@FXML
private ListView<ITwoColumnListViewItem> listViewFilters;
@FXML
private TextField patternTextField;
@FXML
private Button buttonSelectDir;
@FXML
private Button buttonSelectFile;
@FXML
private Button buttonAdd;
@FXML
private Button buttonDelete;
private ObservableList<ITwoColumnListViewItem> listItems;
@PostConstruct
public void init() {
PieUser user = beanService.getBean(PieShareAppBeanNames.getPieUser());
configuration = user.getPieShareConfiguration();
}
public void setBeanService(IBeanService beanService) {
this.beanService = beanService;
}
public void setFXMLController(FXMLController fXMLController) {
this.fXMLController = fXMLController;
}
public void setFileService(IFileService fileService) {
this.fileService = fileService;
}
public void setRegexService(IRegexService regexService) {
this.regexService = regexService;
}
public void setFileFilterService(IFileFilterService fileFilterService) {
this.fileFilterService = fileFilterService;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
buttonAdd.disableProperty().set(true);
buttonSelectFile.setText("");
InputStream stFile = getClass().getResourceAsStream("/images/fileIcon_24.png");
Image imageFile = new Image(stFile);
buttonSelectFile.setGraphic(new ImageView(imageFile));
buttonSelectDir.setText("");
InputStream stDir = getClass().getResourceAsStream("/images/dirIcon_24.png");
Image imageDir = new Image(stDir);
buttonSelectDir.setGraphic(new ImageView(imageDir));
buttonAdd.setText("");
InputStream stAdd = getClass().getResourceAsStream("/images/add_24.png");
Image imageAdd = new Image(stAdd);
buttonAdd.setGraphic(new ImageView(imageAdd));
buttonDelete.setText("");
InputStream stDelete = getClass().getResourceAsStream("/images/remove_24.png");
Image imageDelete = new Image(stDelete);
buttonDelete.setGraphic(new ImageView(imageDelete));
listItems = FXCollections.observableArrayList();
listViewFilters.setItems(listItems);
listViewFilters.setCellFactory(new Callback<ListView<ITwoColumnListViewItem>, ListCell<ITwoColumnListViewItem>>() {
@Override
public ListCell<ITwoColumnListViewItem> call(final ListView<ITwoColumnListViewItem> param) {
return new TwoColumnListViewEntry();
}
});
listViewFilters.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent arg0) {
if (listViewFilters.getSelectionModel().getSelectedItems() != null) {
patternTextField.setText(((IFilter) listViewFilters.getSelectionModel().getSelectedItem().getObject()).getPattern());
}
}
});
refreshList();
patternTextField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observableValue, String s, String s2) {
//Clear all Styles.
patternTextField.getStyleClass().clear();
if (patternTextField.textProperty().isEmpty().get()) {
buttonAdd.disableProperty().set(true);
patternTextField.getStyleClass().add("textfieldWrong");
return;
}
try {
regexService.setPattern(s2);
}
catch (Exception ex) {
buttonAdd.disableProperty().set(true);
patternTextField.getStyleClass().add("textfieldWrong");
return;
}
patternTextField.getStyleClass().add("textfieldOK");
buttonAdd.disableProperty().set(false);
}
});
}
@FXML
private void handleAddAction(ActionEvent event) {
String text = patternTextField.getText();
IFilter fil = beanService.getBean(RegexFileFilter.class);
fil.setPattern(text);
fileFilterService.addFilter(fil);
refreshList();
}
@FXML
private void handleSelectDirAction(ActionEvent event) {
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle("Select path to ignore");
chooser.setInitialDirectory(configuration.getWorkingDir());
File choosenFile = chooser.showDialog(fXMLController.getMainStage());
if (choosenFile == null || !choosenFile.exists()) {
return;
}
Path relative = fileService.relitivizeFilePath(choosenFile);
patternTextField.setText(String.format("%s/%s", relative.toString(), ".*"));
}
@FXML
private void handleSelectFileAction(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Select path to ignore");
chooser.setInitialDirectory(configuration.getWorkingDir());
File choosenFile = chooser.showOpenDialog(fXMLController.getMainStage());
if (choosenFile == null || !choosenFile.exists()) {
return;
}
Path relative = fileService.relitivizeFilePath(choosenFile);
patternTextField.setText(relative.toString());
}
@FXML
private void handleClearTextAction(ActionEvent event) {
patternTextField.clear();
}
@FXML
private void handleDeleteAction(ActionEvent event) {
if (listViewFilters.getSelectionModel().getSelectedItem() != null) {
fileFilterService.removeFilter((IFilter) listViewFilters.getSelectionModel().getSelectedItem().getObject());
}
refreshList();
}
public void refreshList() {
listItems.clear();
for (IFilter filter : fileFilterService.getAllFilters()) {
listItems.add(new ITwoColumnListViewItem() {
@Override
public Object getObject() {
return filter; //To change body of generated methods, choose Tools | Templates.
}
@Override
public Label getSecondColumn() {
Label label = new Label(filter.getPattern());
return label;
}
@Override
public Node getFirstColumn() {
//CheckBox ch = new CheckBox("");
return null;//ch;
}
@Override
public IController getController() {
return null;
}
});
}
}
@Override
public Node getSecondColumn() {
return new Label("Filter Settings");
}
@Override
public Node getFirstColumn() {
InputStream st = getClass().getResourceAsStream("/images/filter_16.png");
Image image = new Image(st);
Label label = new Label("", new ImageView(image));
return label;
}
@Override
public IController getController() {
return this;
}
@Override
public Node getControl() throws IOException {
FXMLLoader loader = beanService.getBean(PieShareAppBeanNames.getGUILoader());
return loader.load(getClass().getResourceAsStream("/fxml/settingsPanels/FileFilterSettingPanel.fxml"));
}
}